﻿#include "mario.h"

CMario::CMario(LPD3DXSPRITE SpriteHandler, float XHandle, float YHandle, int ScreenWidth, int ScreenHeight)
	:CGravityObject(SpriteHandler, XHandle, YHandle, ScreenWidth, ScreenHeight)
{
	//Các sprite hình
	_sprite_small_left = NULL;
	_sprite_small_right = NULL;
	_sprite_big_left = NULL;
	_sprite_big_right = NULL;
	
	_is_small = true;
	_is_super = false;
	_on_air = false;
	_is_fall_down = false;
	_elapsed_time_change_frame = Config::MARIO_SMALL_CHANGE_FRAME;
	_current_frame_height = Config::MARIO_SMALL_SPRITE_HEIGHT;
	_current_frame_width = Config::MARIO_SMALL_SPRITE_WIDTH;
	_a = 0;
	_vxo = 0;
	_vyo = 0;
	_vx = 0;
	_vy = 0;
	_vx_last = 1;
	_y_pre = 0;
	_g = Config::GRAVITY;
	
}

CMario::~CMario()
{
	delete _sprite_small_left;
	delete _sprite_small_right;
	delete _sprite_big_left;
	delete _sprite_big_right;
}

void CMario::Init(LPDIRECT3DDEVICE9 d3dDevice)
{
	//Khởi tạo sprite mario nhỏ trái
	_sprite_small_left = new CSprite(
		_SpriteHandler, 
		Config::MARIO_SMALL_IMAGE_LEFT,
		Config::MARIO_SMALL_SPRITE_WIDTH,
		Config::MARIO_SMALL_SPRITE_HEIGHT,
		Config::MARIO_SMALL_SPRITE_COUNT,
		Config::MARIO_SMALL_SPRITE_SPRITEPERROW);

	//Khởi tạo sprite mario nhỏ phải
	_sprite_small_right = new CSprite(
		_SpriteHandler, 
		Config::MARIO_SMALL_IMAGE_RIGHT,
		Config::MARIO_SMALL_SPRITE_WIDTH,
		Config::MARIO_SMALL_SPRITE_HEIGHT,
		Config::MARIO_SMALL_SPRITE_COUNT,
		Config::MARIO_SMALL_SPRITE_SPRITEPERROW);

	//Khởi tạo sprite mario nhảy sang trái
	_sprite_small_jump_left = new CSprite(
		_SpriteHandler,
		Config::MARIO_SMALL_IMAGE_JUMP_LEFT,
		Config::MARIO_SMALL_SPRITE_WIDTH,
		Config::MARIO_SMALL_SPRITE_HEIGHT,
		Config::MARIO_SPRITE_JUMP_COUNT,
		Config::MARIO_SPRITE_JUMP_SPRITEPERROW);

	//Khởi tạo sprite mario nhảy sang phải
	_sprite_small_jump_right = new CSprite(
		_SpriteHandler,
		Config::MARIO_SMALL_IMAGE_JUMP_RIGHT,
		Config::MARIO_SMALL_SPRITE_WIDTH,
		Config::MARIO_SMALL_SPRITE_HEIGHT,
		Config::MARIO_SPRITE_JUMP_COUNT,
		Config::MARIO_SPRITE_JUMP_SPRITEPERROW);

	//Khởi tạo sprite mario lớn trái
	_sprite_big_left = new CSprite(
		_SpriteHandler, 
		Config::MARIO_BIG_IMAGE_LEFT,
		Config::MARIO_BIG_SPRITE_WIDTH,
		Config::MARIO_BIG_SPRITE_HEIGHT,
		Config::MARIO_BIG_SPRITE_COUNT,
		Config::MARIO_BIG_SPRITE_SPRITEPERROW);

	//Khởi tạo sprite mario lớn nhảy sang trái
	_sprite_big_jump_left = new CSprite(
		_SpriteHandler, 
		Config::MARIO_BIG_IMAGE_JUMP_LEFT,
		Config::MARIO_BIG_SPRITE_WIDTH,
		Config::MARIO_BIG_SPRITE_HEIGHT,
		Config::MARIO_SPRITE_JUMP_COUNT,
		Config::MARIO_SPRITE_JUMP_SPRITEPERROW);

	//Khởi tạo sprite mario lớn phải
	_sprite_big_right = new CSprite(
		_SpriteHandler, 
		Config::MARIO_BIG_IMAGE_RIGHT,
		Config::MARIO_BIG_SPRITE_WIDTH,
		Config::MARIO_BIG_SPRITE_HEIGHT,
		Config::MARIO_BIG_SPRITE_COUNT,
		Config::MARIO_BIG_SPRITE_SPRITEPERROW);

	//Khởi tạo sprite mario lớn nhảy sang phải
	_sprite_big_jump_right = new CSprite(
		_SpriteHandler, 
		Config::MARIO_BIG_IMAGE_JUMP_RIGHT,
		Config::MARIO_BIG_SPRITE_WIDTH,
		Config::MARIO_BIG_SPRITE_HEIGHT,
		Config::MARIO_SPRITE_JUMP_COUNT,
		Config::MARIO_SPRITE_JUMP_SPRITEPERROW);
}

void CMario::Update(int t)
{
	//Mario di chuyển có gia tốc
	//Vận tốc tức thời được quy về 1 hướng để tính toán
	if(_a != 0)
	{
		_time_x = GetTickCount() - _time_start_x;

		//Vận tốc tức thời của mario
		float vx_temp = _vxo + _a * _time_x;
		_vx = vx_temp * _vx_last;

		//Khi mario đạt vận tốc tối đa
		if(vx_temp >= Config::MARIO_MAX_SPEED)
		{
			_a = 0;
			_vx = Config::MARIO_MAX_SPEED * _vx_last;
		}

		//Khi mario đạt vận tốc thấp nhất
		if(vx_temp < 0)
		{
			_a = 0;
			_vx = 0;
		}
	}

	//Mario có gia tốc trọng trường
	_ObjectWithGravity();

	//Khi mario đạt độ cao tối đa
	//hoặc có lệnh rơi khi đạt độ cao tối thiểu
	if((y_handle - _y_pre >= Config::MARIO_MAX_JUMP + _rand_jump && _y_pre != 0) ||
		(y_handle - _y_pre >= Config::MARIO_MIN_JUMP && _is_fall_down))
	{
		_FallDown();
		_is_fall_down = false;
	}

	//Cập nhật tọa độ 
	_UpdatePosition(t);
}

void CMario::Draw()
{
	//Chuyển frame hình khi nhân vật di chuyển
	DWORD now = GetTickCount();

	if(now - _last_time >= _elapsed_time_change_frame && !_on_air)
	{
		if(_vx > 0) _MoveRight();
		if(_vx < 0) _MoveLeft();
		if(_vx == 0) _Stand();
		_last_time = now;
	}

	//Vẽ sprite hình
	_SpriteHandler->Begin(D3DXSPRITE_ALPHABLEND);

	if(_is_small)
	{
		if(_vy == 0)
		{
			if(_vx > 0 || _vx_last > 0)
				_sprite_small_right->Render(_x_draw, _y_draw);

			else if(_vx < 0 || _vx_last < 0)
				_sprite_small_left->Render(_x_draw, _y_draw);
		}
		else 
		{
			if(_vx > 0 || _vx_last > 0)
				_sprite_small_jump_right->Render(_x_draw, _y_draw);

			else if(_vx < 0 || _vx_last < 0)
				_sprite_small_jump_left->Render(_x_draw, _y_draw);
		}
	}
	else if(_is_super)
	{
		if(_vy == 0)
		{
			
		}
		else 
		{

		}
	}
	else 
	{
		if(_vy == 0)
		{
			if(_vx > 0 || _vx_last > 0)
				_sprite_big_right->Render(_x_draw, _y_draw);
			
			else if(_vx < 0 || _vx_last < 0)
				_sprite_big_left->Render(_x_draw, _y_draw);
		}
		else 
		{
			if(_vx > 0 || _vx_last > 0)
				_sprite_big_jump_right->Render(_x_draw, _y_draw);

			else if(_vx < 0 || _vx_last < 0)
				_sprite_big_jump_left->Render(_x_draw, _y_draw);
		}
	}

	_SpriteHandler->End();
}

/*=======Control======*/
//Change
void CMario::SetToBig()
{
	_is_small = false;
	_is_super = false;
	_current_frame_height = Config::MARIO_BIG_SPRITE_HEIGHT;
	_current_frame_width = Config::MARIO_BIG_SPRITE_WIDTH;
	
	//Tốc độ chuyển frame hình
	_elapsed_time_change_frame = Config::MARIO_BIG_CHANGE_FRAME;
	y_handle = _ground + _current_frame_height;
}

void CMario::SetToSmall()
{
	_current_frame_height = Config::MARIO_SMALL_SPRITE_HEIGHT;
	_current_frame_width = Config::MARIO_SMALL_SPRITE_WIDTH;

	//Tốc độ chuyển hình
	_elapsed_time_change_frame = Config::MARIO_SMALL_CHANGE_FRAME;
	y_handle = _ground + _current_frame_height;
}

void CMario::SetToSuper()
{
	SetToBig();
	_is_super = true;
}

//Move
void CMario::KeyLeftPress()
{
	_vx_last = -1;
}

void CMario::KeyRightPress()
{
	_vx_last = 1;
}

void CMario::KeyMoveDown()
{
	_a = Config::MARIO_A;
	_time_start_x = GetTickCount();
	_vxo = 0;
}

void CMario::KeyMoveUp()
{
	_a = - Config::MARIO_A; 
	_time_start_x = GetTickCount();
	_vxo = _vx * _vx_last - 0.001f;
	_vx = 0;
}

void CMario::KeyJumpDown()
{
	//Chỉ nhảy khi mario đang chạm đất
	if(y_handle - _current_frame_height <= _ground) 
	{
		_time_start_y = GetTickCount();
		_on_air = true;
		_y_pre = y_handle;
		_rand_jump = rand() % 10 + 5;
		_g = Config::GRAVITY;
		_vyo = 0;
	}
}

void CMario::KeyJumpUp()
{
	//mario không rơi lại khi đang trong trạng thái rơi
	if(_g > 0)
	{
		_is_fall_down = true;
	}
}

/*=======Action======*/
void CMario::_MoveLeft()
{
	if(_is_small)
	{
		_sprite_small_left->Next();
	}
	else
	{
		if(_is_super)
		{

		}
		else
		{
			_sprite_big_left->Next();
		}
	}
}

void CMario::_MoveRight()
{
	if(_is_small)
	{
		_sprite_small_right->Next();
	}
	else 
	{
		if(_is_super)
		{

		}
		else 
		{
			_sprite_big_right->Next();
		}
	}
}

void CMario::_Stand()
{
	_sprite_small_left->Reset();
	_sprite_small_right->Reset();
	_sprite_big_left->Reset();
	_sprite_big_right->Reset();
}

void CMario::_Jump()
{

}